#ifndef CONFIG_H_
#define CONFIG_H_

#define MAX_LANE_NUM 8
#define MAX_LAMP_NUM 4
#define MAX_CAMERA_STRATEGY 4

#include <cv.h>
#include "Common/common.h"


/*struct CvPoint
{
	int x, y;
};
struct CvRect
{
	int x, y;
	int width, height;
};*/


struct SLine
{
	struct CvPoint start;
	struct CvPoint end;
};

struct CFGSysCtrl	// 系统控制
{
	bool enableMonitor;					// 使能软件看门狗[true]
	bool enableFlowReport;				// 使能交通流量报告
	unsigned int  intervalFlowReport;	// 交通流量报告时间间隔（单位：秒）
};


// 电警与卡口公共部分

struct CFGSysService	// 系统服务配置
{
	bool bAsClient;				// [false]
	char serverIP[32];			// 若为客户端，则该字段有效，否则无效
	unsigned short dataPort;		// 若为客户端，则该值为serverIP所指服务器接收数据的端口，否则为向外提供数据服务的端口
	unsigned short configPort;	// 配置端口
	unsigned short debugPort;	// 调试端口
};

struct CFGCameraCtrlStrategy	// 调度
{
	CAMERA_CTRL items[CAMERA_CTRL_MAX];		// 控制项
	char startHour[CAMERA_CTRL_MAX];		// 调度起始时间
	char endHour[CAMERA_CTRL_MAX];			// 调度结束时间
	int value[CAMERA_CTRL_MAX];				// 控制项值
};

struct CFGCameraCtrl	// 相机控制
{
    unsigned short imageWidth;		// 图像宽度
    unsigned short imageHeight;		// 图像高度
    unsigned char imageFPS;			// 相机帧率
    unsigned short videoWidth;		// 视频宽度
    unsigned short videoHeight;		// 视频高度
    int videoRate;					// 视频码率
    char strategyNum;				// 相机参数调度策略数目
    char strategyItemNum;			// 调度项中包含的配置项数目
    struct CFGCameraCtrlStrategy items[MAX_CAMERA_STRATEGY];
};

struct CFGCamera		// 相机配置
{
    char IP[32];			// 相机IP地址
    bool enableCtrl;		// 相机控制使能[true]
    CFGCameraCtrl ctrl;
};

struct CFGInfo			// 系统基本属性
{
    bool isEPoliceSys;							// 系统为电警系统还是卡口系统标记，傎为true表示系统为电警系统，否则为卡口系统[true]
    char monitorID[32];							// 监控点编号
    char directionID[32];						// 方向编号
    char monitorName[32];						// 监控点名称（地址）
    char directionName[32];						// 方向名称
    char machineID[32];							// 设备ID
    unsigned short laneNum;						// 车道数目[2]
    unsigned short limitSpeed[MAX_LANE_NUM];	// 车道限速值
};

enum COLOR
{
	COLOR_NONE   = 0,
	COLOR_RED    = 1,
	COLOR_GREEN  = 2,
	COLOR_BLUE   = 3,
	COLOR_WHTITE = 4,
	COLOR_BLACK  = 5,
	COLOR_DARK_RED = 6
};
struct CFGText		// OSD(text)
{
	unsigned char fontSize;
	COLOR color;
};

struct CFGOSDFlag		// OSD开关配置
{
    bool drawImgMachineNo;			// 图像打印机器编号[false]
    bool drawImgAddr;				// 图像打印地址信息[true]
    bool drawImgDirection;			// 图像打印方向名称[true]
    bool drawImgLaneNo;				// 图像打印车道号[true]
    bool drawImgTime;				// 图像打印抓拍时间[true]
    bool drawImgPlate;				// 图像打印号牌[false]
    bool drawImgPlateColor;			// 图像打印号牌颜色[false]
    bool drawImgVehicleStyle;		// 图像打印机动车类型[false]
    bool drawImgSpeed;				// 图像打印车速[false]
    bool drawImgViolation;			// 图像打印违章类型[false]

    bool drawVideoAddr;				// 视频打印地址[false]
    bool drawVideoDirection;		// 视频打印方向称[false]
    bool drawVideoTime;				// 视频打印时间[false]
};

struct CFGBackup	// 备份
{
    bool enable;						// 备份使能[true]
    int number;						// 最大备份数目
    char dir[128];					// 备份目录（全路径）
    char dbName[128];				// 备份数据管理数据库全路径
};

struct CFGVideoStore	// 视频存储（全程录像）
{
    bool enable;						// 使能视频存储[false]
    int timePerFile; 				// 每段视频长度，单位：分钟[10]
    int maxDay;						// 视频最长存储时间，单位：天[7]
    char dir[128];					// 存储目录（全路径）
    char dbName[128];				// 存储数据记录数据库
};

struct CFGCommon
{
	struct CFGInfo baseInfo;
	struct CFGSysCtrl sysCtrl;
	struct CFGSysService sysService;
	struct CFGCamera camera;
	struct CFGOSDFlag osdFlags;
	struct CFGText text;
	struct CFGBackup backup;
	struct CFGVideoStore videoStore;
};


// 卡口系统

struct CFGGatewayVideoSpeed	// 视频测速
{
    unsigned short leftTopX;
    unsigned short leftTopY;

    unsigned short rightTopX;
    unsigned short rightTopY;

    unsigned short leftBottomX;
    unsigned short leftBottomY;

    unsigned short rightBottomX;
    unsigned short rightBottomY;

    float roadWidth;
    float roadHeight;
};

struct CFGGatewayAlgo
{
    CvRect detectRegion;
    float recoVideoRatio;
    struct CFGGatewayVideoSpeed speed;
};

struct CFGGatewaySwitch
{
    bool enableVideoReco;	// [true]
    bool enableVideoSpeed;	// [false]
};

struct CFGGateway
{
	struct CFGGatewaySwitch switches;
	struct CFGGatewayAlgo algo;
};


// 电警系统

struct CFGLane			// 车道配置
{
	bool enableSimulate;				// 红灯模拟使能[false]
	int directions;					// 允许方向(行驶规则)，由DIRECTION_LEFT，[DIRECTION_STRAIGHT]，DIRECTION_RIGHT，DIRECTION_UTURN组合
	int dirLamps;						// 方向对应信号灯的ID号（由低位到高位，每4bits表示一个方向对应的ID号）
	/*
	 *     0~3bits           4~7bits          8~11bits         12~15bits
	 * DIRECTION_LEFT  [DIRECTION_STRAIGHT] DIRECTION_RIGHT  DIRECTION_UTURN
	*/
	bool isSpecialConverse;			// 通常情况下，逆行是迎面向相机驶来的汽车（相机所能看到的时车头）。特殊逆行是指背离相机驶去的汽车（需要将对应车道的红灯模拟开启）
	bool enableRed;					// 使能红灯抓拍[true]
	bool enableChannel;				// 使能不按车道行驶抓拍[true]
	bool enableCrossLine;			// 使能压线抓拍[true]
	bool enableConverse;				// 使能逆行抓拍[true]
};

struct CFGLamp		// 视频信号灯属性--CONFIG_LAMP
{
	int  shape;					// 信号灯形状[圆形箭头]
	CvRect regions[3];				// 信号灯对应的矩形区域
	
	int  greenDelay;				// 绿灯延时，以秒为单位（isIn1Rect为true时有效），绿灯转红灯之间黄灯黄灯持续时间
};

struct CFGPoliceLamp	// 视频信号灯配置
{
	int  hwType;						// 检测器类型[LAMP_DETECTOR_TYPE_KISE]。注：该参数仅在非视频检测模式下被使用
	int  number;						// 信号灯数量[2]
	bool enableCorrect;				// 红灯修正使能[true]
	int  correctLevel;				// 红灯修正级别[1](5个等级1~5依次为最浅，较浅，中度，较深，最深)
	CFGLamp lamps[MAX_LAMP_NUM];	// 信号灯配置
};

struct CFGPoliceOutput	// 抓拍控制
{
	bool enableGateway;			// 卡口上报使能[false]
	bool enableNoPlate;			// 未识别出车牌数据上报开关
	int jpegMaxKb;				// unit in KB[300]
	bool enableBanner;			// 使能文字信息在图像额外区域[true]
	PICTURE_FORM pictureForm;	// 3独立图片，否则为三张组合[true]
	bool enableVideo;				// 使能抓拍录像[true]
	bool enableMachine;			// 使能磁盘存储[false]

};

struct CFGPoliceEvent	// 事件检测参数
{
	int   minification;				// 缩小比例[4]
	bool  enableCrossLight;			// 压线程度，为true时压线，为false时为骑线[false]
	bool enableDebug;					// 使能事件检测调试信息[false]
	SLine lines[MAX_LANE_NUM][3];	// 线依次从下往上
	int forbiddenTypes;				// 违反禁令标志类型[FORBIDDEN_TYPE_NONE]
};

struct CFGReco	// 识别参数
{
	bool enable;					// 识别控制开关[true]
	float ratio;					// 拉伸比例[1.3]
	char province[4];				// 默认省份[川]
};

struct CFGPolice	// 电子警察参数
{
	struct CFGPoliceOutput outputCtrl;
	struct CFGLane lanes[MAX_LANE_NUM];
	struct CFGPoliceLamp allLamp;				
	struct CFGPoliceEvent event;
	struct CFGReco reco;
};


void ReadCommonConfig(int cameraNo, struct CFGCommon& cfgCommon);
void ReadGatewayConfig(int cameraNo, struct CFGGateway& cfgGateway, const struct CFGCommon& cfgCommon);
void ReadPoliceConfig(int cameraNo, struct CFGPolice& cfgPolice, const struct CFGCommon& cfgCommon);

void WriteCommonConfig(int cameraNo, const struct CFGCommon& cfgCommon);
void WriteGatewayConfig(int cameraNo, const struct CFGGateway& cfgGateway, const struct CFGCommon& cfgCommon);
void WritePoliceConfig(int cameraNo, const struct CFGPolice& cfgPolice, const struct CFGCommon& cfgCommon);

#endif // CONFIG_H_

